iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
佛心分享-SideProject30

RAG 和 MongoDB Vector Search系列 第 11

Naive RAG: 運用Flask框架運行LangChain

  • 分享至 

  • xImage
  •  

今天要分享:使用LangChain 的架構去製作RAG的聊天機器人,這邊主要會使用flask的開發框架來搭建後台。因為Flask的使用相對簡單,而且在未來只要對RAG實作有興趣的同學甚至可以將Flask搭建起來的Server去和常見的聊天室串接,像是LineBot。

  1. 先載入必要的資源
from dotenv import load_dotenv
from pymongo import MongoClient
import os

# 載入環境變數
load_dotenv(".env")
# 連接mongoDB
client = MongoClient('your_connection_string')
db = client['practice_CRUD']
collection = db['contexts'] #我們將chunks開立一個新的collection儲存
vector_search_index = 'embedding_SearchIndexes' #先指定在MongoDB 當中建立的Vector Search Index名稱
app = Flask(__name__)#此為Flask預設的程式碼

api_key=os.getenv("AZURE_OPENAI_API_KEY")
api_version="2024-02-01"
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT")

# 配置 Azure OpenAI 聊天功能
llm = AzureChatOpenAI(
    api_key=api_key,
    azure_endpoint=azure_endpoint,
    openai_api_version="2024-02-01",
    azure_deployment="gpt-4o"
)

# 配置 Azure OpenAI 嵌入功能
aoai_embeddings = AzureOpenAIEmbeddings(
    api_key=api_key,
    azure_endpoint=azure_endpoint,
    openai_api_version="2024-02-01",
    azure_deployment="text-embedding-ada-002",
    disallowed_special=()
)
  1. 然後,我們還需要設定RAG過程的任務,這裡我們主要還是使用LangChain提供的套件去進行檢索。在這裡我們可以看到LangChain的模組化設計的方便之處,只要告知他檢索的方式,問答的資訊就可以串接出結合RAG技術的LLM。
@app.route('/query_langchain', methods=['POST'])
def query_langchain():
    data = request.json
    question = data.get('query', '')

    vector_store = MongoDBAtlasVectorSearch(
        collection=collection, #告知要使用的是哪一個資料夾進行資料搜索
        embedding=aoai_embeddings, #告知要使用哪種向量化模型
        index_name=vector_search_index, #index名稱
        text_key="content" #這裡需要指定document文字的key。經過similarity找到相似的document後,會返回這個key的值
    )
    #初始化要進行檢索的方式,5是代表只會返回前五名相似的資訊
    qa_retriever = vector_store.as_retriever(
        search_type="similarity",
        search_kwargs={"k": 5},
    )
    system_prompt= ("使用以下上下文來回答問題。如果你不知道答案,就說你不知道,不要試圖編造答案。"
        "Context: {context}"
    )
    prompt = ChatPromptTemplate.from_messages(
        [
           ("system", system_prompt),("human", question) 
        ]
    )
    question_answer_chain = create_stuff_documents_chain(llm, prompt)
    chain = create_retrieval_chain(
       qa_retriever, question_answer_chain
    )

    # 使用chain
    result = chain.invoke({"input": question})
   
    return jsonify({"response": 'Success', 'status': '200', 'answer': result['answer']})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

註:昨天有提到兩種prompt,一種是只有系統看得到的SystemPrompt,另一種是使用者輸入想要詢問LLM的敘述,也就是human所代表的UserPrompt。

以上就是建立簡易版RAG的後端程式碼!如果想要嘗試的朋友,可以直接在自己電腦運行起來這個flask server。如果需要互動介面,可以串接linebot喔!

運行Flask Server之後,我自己是使用Postman去對url提出Post來去驗證運作是否成功。這邊也提供一下使用Postman的方法,我是直接在VScode裡面的extention使用。
https://ithelp.ithome.com.tw/upload/images/20240925/201673598Co6y5uNzx.png


上一篇
Naive RAG
系列文
RAG 和 MongoDB Vector Search11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言